const fs = require('fs');
const cheerio = require('cheerio');
const puppeteer = require('puppeteer-core');

(async () => {
    // 初始化puppeteer
    const browser = await puppeteer.launch({
        executablePath: 'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe',
        headless: true  //headless默认为true表示不启动GUI
    });

    // 获取page实例
    const page = await browser.newPage();

    // 将webdriver字段删除，防止反爬虫
    await page.evaluateOnNewDocument(()=>{
        const newProto = navigator.__proto__;
        delete newProto.webdriver;
        navigator.__proto__ = newProto;
    })

    // 设置useragent，如果headless设置为true，则必做
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36 Edg/85.0.564.41');

    url = 'https://kns.cnki.net/kcms/detail/knetsearch.aspx?sfield=kw&skey=5G%E7%BD%91%E7%BB%9C&code='
    await page.goto(url,{waitUntil:'networkidle2'})
    
    var page_content,frame_content,$,frame;

    // 页面滚动方法
    // 对知网而言只是为了确保刷新内容
    async function scrollPage() {
        page_content = await page.content()
        $ = cheerio.load(page_content)
            
        // 执行js代码（滚动）
        await page.evaluate(()=>{
            // 渐进滚动，直接跳转可能不刷新内容
            window.scrollTo({behavior: "smooth",top: document.body.scrollHeight});
        })

        // 获取frame内联页面首页
        let home_page = await page.frames().find(f => f.name() === 'frame7')
        return home_page
    } 

    // 获取内联页面frame（首页）
    frame = await scrollPage()
    await frame.waitFor('.mainCont')

    // 首页、末页 12个a标签 下一页分别在10 和 没有
    // 其余页14个a标签 下一页在12
    async function nextPage(){
        const alist = await frame.$$('.pageBar a')
        const next_page_button = alist.length > 12 ?
        alist[12] : alist[10]
        await next_page_button.click();
    }

    var data = {list:[]};
    var count = 1;

    async function getURL(){
        frame = await page.frames().find(f => f.name() === 'frame7')
        await frame.waitFor('.mainCont')
        frame_content = await frame.content()
        $ = cheerio.load(frame_content)
        
        // 获取文献url
        let li = $($('.essayBox').find('ul')[0]).find('li')
        // 封装返回的数据
        li.map(function(index,item){
            // 不是undefined就加入，否则加入空
            $(item).find('a').attr('href') != undefined ?
            data.list.push({
                num: count++,
                src: $(item).find('a').attr('href'),
                title: $($(item).find('a')[0]).text(),
            }):''
        })
        // 点击下一页
        await nextPage();
    }

    while(data.list.length<400)
    {
        await getURL();
        await page.waitFor(1000);
        console.log("count=",count)
    }

    fs.writeFileSync('5g文献.json',JSON.stringify(data))

    await browser.close()
})()
